#

| Chapter 27 Searching Through Files |

## 27.13 More grep-like Programs Written in Perl

[Article 27.12 gave a sense of how easy it might be to write custom search programs in Perl...but until you learn the language, you can't rip these off whenever you find yourself in need. This article describes a few more custom greps written in Perl. It doesn't show the scripts themselves, just how to use them. If you like them, they are on the disc and the online archive. -TOR ]

tgrep | The tgrep program greps only those files containing textual data. It's useful in a directory that has mixed binary and textual files, when the filenames aren't a sufficient clue to the nature of the file. tgrep has one option, -l, which causes it to list the files containing the pattern rather than listing the lines containing the pattern.

pipegrep | The pipegrep program greps the output of a series of commands. The difficulty with doing this using the normal grep program is that you lose track of which file was being processed. This program prints out the command it was executing at the time, including the filename. The command, which is a single argument, will be executed once for each file in the list. If you give the string `{}` anywhere in the command, the filename will be substituted at that point. Otherwise the filename will be added on to the end of the command. This program has one option, -l, which causes it to list the files containing the pattern. For example [nm is a programmers' utility that prints symbol name lists-JP ]:

>     $ cd /usr/lib
>     $ pipegrep 'sys_nerr' nm lib*.a
>     nm /usr/lib/libX11.a |:          U _sys_nerr
>     nm /usr/lib/libXaw.a |:          U _sys_nerr
>     nm /usr/lib/libXaw.a |:          U _sys_nerr
>     nm /usr/lib/libc.a |:            U _sys_nerr
>                .
>                .
>                .

cgrep | The cgrep program greps for a pattern in the specified files, and prints out that line with several lines of surrounding context. This context grep script lets you specify how many lines of context you want if you want more or less than the default. For example:

>     $ cgrep -3 pattern files

would give you three lines of context above and below the matching line. Each occurrence is separated from the next by a short horizontal line (`-----`).

- LW, RS, TC from O'Reilly & Associates' Programming Perl

27.12 Make Custom grep Commands (etc.) with perl |  | 27.14 Compound Searches